# 异常处理
'''
try:
    可能会发生异常的代码
except 某个异常:
    针对try语句块发生的异常进行捕获 并执行相应的处理逻辑
except 另外某个异常:
    ......
else:
    try语句块没有发生任何异常则会执行
finally:
    不管有没有发生异常都会执行
'''
try:
    # 除数不能为零，会抛出除零异常
    # 一旦发生了异常 会立即跳出try语句块 直接进入except语句块
    # 然后依次按照从前往后的顺序去匹配except中捕获的异常
    # 直到第一个匹配上的异常 则进入对应的except中进行处理（最多只能有一个except进行处理）
    # try语句块中发生了异常之后的代码会被直接忽略
    10 / 0
    print("ok")
except Exception as e:
    print(e)
except ZeroDivisionError as e:
    print(e)
    print("做自己的处理")
    print("发生了除零错误，请检查除数是否为零")
except IndexError as e:
    print(e)
    print("发生了索引越界异常，请检查索引")
except (NameError, TypeError) as e:
    print(e)
else:
    print("没有发生任何异常才会执行")
finally:
    print("不管有没有发生异常，都会执行")


# 自定义异常 只需要继承自Exception
class MyException(Exception):
    pass


age = -1
try:
    if age < 0 or age > 200:  # 如果有多个条件需要一起判断可以使用 and与 or或 ^异或 连接
        # print("年龄不符合规范")
        # 抛出异常
        # raise ValueError("值异常")
        raise MyException("年龄不符合规范异常")
    elif age < 18:
        print("未成年")
    elif age >= 18:
        print("成年")
    elif age == 18:  # 等值判断需要使用两个等于号，因为一个等号表示赋值
        print("18岁")
    else:
        pass  # 表示什么都不干
except MyException as e:
    print(e)
    print("请检查age是否符合规范")
